package com.mh.common;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.Date;

/**
 * JWT token使用流程
 * 1.登陆成功后生成jwt token
 * 2.返回给前端页面
 * 3.前端接收token，存入session缓存中
 * 4.当前端向后台发送请求时，需要携带token，将token一起发送给后台
 * 5.后台通过拦截器对请求进行解析，获取token，然后对token进行验证（过期时间，token的合法性）
 * 6.验证成功，拦截器放行，请求继续访问后台接口
 * 7.验证失败，抛异常返回
 */
@Component
public class JwtComponent {
    /**
     * 生成jwt
     */
    public String sign(String phone, String password) {
        Algorithm alg = Algorithm.HMAC256(phone + password);

        //设置三小时后过期
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR_OF_DAY, 3);

        Date expireTime = cal.getTime();

        return JWT.create().withClaim("phone", phone).withExpiresAt(expireTime).sign(alg);
    }

    /**
     * 获取token中的phone
     *
     * @param token
     * @return
     */
    public String getPhone(String token) {
        DecodedJWT decode = JWT.decode(token);
        return decode.getClaim("phone").asString();
    }

    /**
     * 获取过期时间
     *
     * @param token
     * @return
     */
    public Date getExpireTime(String token) {
        DecodedJWT decode = JWT.decode(token);
        return decode.getExpiresAt();
    }

    /**
     * 验证token
     * @param token
     * @param phone
     * @param password
     * @return
     */
    public boolean verify(String token,String phone,String password){
        try {
            Algorithm alg = Algorithm.HMAC256(phone + password);
            JWTVerifier verifier = JWT.require(alg).build();
            verifier.verify(token);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }



}
